#include <REGX52.H>
#include <intrins.H>
#include "DELAY.H"

//引脚定义
sbit OneWire_DQ=P2^2;//DHT引脚
/**
  * @brief  单总线开始
  * @param  无
  * @retval 无
  */
void OneWire_Start(void)
{
	unsigned char i;
	OneWire_DQ=1;
	i = 2;while (--i);			//Delay 30us
	OneWire_DQ=0;
	Delay(1);		//Delay 1ms
	OneWire_DQ=1;
	i = 15;while (--i);			//Delay 30us
}

/**
  * @brief  DHT22应答
  * @param  无
  * @retval 无
  */

unsigned char OneWire_Ack(void)
{
	unsigned char count=0;
	while (OneWire_DQ);
	while (!OneWire_DQ&&count<=90)//DHT22会拉低80us左右 一直计数，超时后跳出循环
	{
		count+=10;
		Delay10us(); //延时10us
	} 
	if(count>90)return 1; //超时说明没有应答，直接返回0
	else count=0;
	while (OneWire_DQ&&count<=90)//DHT22拉低后会再次拉高80us左右
	{
		count+=10;
		Delay10us(); //延时10us
	}
	if(count>90)return 1;	    //超时说明没有应答，直接返回0
	return 0;
}
	

/**
  * @brief  单总线发送一位
  * @param  Bit 要发送的位
  * @retval 无
  */
//void OneWire_SendBit(unsigned char Bit)
//{
//	unsigned char i;
//	EA=0;
//	OneWire_DQ=0;
//	i = 4;while (--i);			//Delay 10us
//	OneWire_DQ=Bit;
//	i = 24;while (--i);			//Delay 50us
//	OneWire_DQ=1;
//	EA=1;
//}

/**
  * @brief  单总线接收一位
  * @param  无
  * @retval 读取的位
  */
unsigned char OneWire_ReceiveBit(void)
{
	unsigned char count=0;
	unsigned char i,temp;	
	//while(OneWire_DQ);//高电平循环，等待低电平
	//count=0;
	while(!OneWire_DQ);//低电平循环，等待高电平
	i = 15;
	while (--i);//延时40us
	if(OneWire_DQ)
	{
		while(OneWire_DQ);
		temp=1;
	}	
	else
		temp=0;
	return temp;
}


void OneWire_Release()
{
	unsigned char i;
	OneWire_DQ=0;
	for(i=0;i<5;i++)
	{
		Delay10us();
	}
	
	OneWire_DQ=1;
}



///**
//  * @brief  单总线发送一个字节
//  * @param  Byte 要发送的字节
//  * @retval 无
//  */
//void OneWire_SendByte(unsigned char Byte)
//{
//	unsigned char i;
//	for(i=0;i<8;i++)
//	{
//		OneWire_SendBit(Byte&(0x01<<i));
//	}
//}


/**
  * @brief  单总线接收一个字节
  * @param  无
  * @retval 接收的一个字节
//  */
unsigned char OneWire_ReceiveByte(void)
{
	unsigned char i;
	unsigned char dat=0x00;
	for (i=0;i<8;i++) 
  {
     dat<<=1; 
     dat|=OneWire_ReceiveBit();
	}			
	return dat;
}

//方法2
//unsigned char OneWire_ReceiveByte(void)
//{
//	unsigned char i;
//	unsigned char j;
//	unsigned char DHT22_Byte = 0;
//	for(i = 0; i < 8; i++)
//	{
//		
//		while(OneWire_DQ == 0);//等待低电平结束
//		j = 15;
//		while (--j);
//		if(OneWire_DQ)// 40 us后仍为高电平则表示数据“1” 
//		{
//			/* 等待数据1的高电平结束 */
//			while(OneWire_DQ);
//			DHT22_Byte |= (unsigned char)(0x01 << (7-i));  //把第7-i位置1，MSB先行 
//		}
//	}
//	return DHT22_Byte;//返回当前读取到的字节
//}

//////////////////////////////////////////////
//unsigned char OneWire_ReceiveByte(void)
//{
//	unsigned char i,j,temp; 
//	unsigned char data_byte; 
//  for(i=0;i<8;i++)//接收8bit的数据 
//  { 
//		//while(io);
//		while(!OneWire_DQ);//等待50us的低电平开始信号结束 
//		j = 15;
//		while (--j);
//		temp=0;//时间为26us-28us表示接收的为数据'0' 
//		if(OneWire_DQ==1) 
//			temp=1; //如果26us-28us之后还为高电平则表示接收的数据为'1' 
//		while(OneWire_DQ);//等待数据信号高电平'0'为26us-28us'1'为70us 
//		data_byte<<=1;//接收的数据为高位在前右移 
//		data_byte|=temp; 
//  } 
//  return data_byte; 
//}
//////////////////////////////////////////////////////////////////
